package com.swak.annotation.im;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.core.annotation.AliasFor;

import com.swak.annotation.Context;
import com.swak.annotation.FluxService;
import com.swak.loadbalance.LoadBalances;
import com.swak.utils.StringUtils;

/**
 * 定义定时任务
 * 
 * @author lifeng
 * @date 2021年2月25日 上午11:05:52
 */
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@FluxService
public @interface DistributedIm {

	/**
	 * IM服务唯一值：指定id = 'OrderIm';
	 * 
	 * @return
	 */
	String id() default StringUtils.EMPTY;

	/**
	 * Spring 实例化的名称
	 * 
	 * @return
	 */
	@AliasFor(annotation = FluxService.class)
	String value() default StringUtils.EMPTY;

	/**
	 * IM服务的中文描述
	 * 
	 * @return
	 */
	String name() default StringUtils.EMPTY;
	
	/**
	 * IM服务处理的命令：'/im/order/:id'
	 * 
	 * @return
	 */
	String path() default StringUtils.EMPTY;
	
	/**
	 * @return 发布的端口
	 */
	int port() default -1;

	/**
	 * 任务分发：dispatchMethod
	 * 
	 * @return
	 */
	String handleMethod() default StringUtils.EMPTY;

	/**
	 * 负载均衡策略
	 * 
	 * @return
	 */
	LoadBalances loadBalance() default LoadBalances.WeightingRoundRobin;
	
	/**
	 * 执行器的权重: 任务分发时会投递给执行器，根据权重来决定投递的份额； 需配合 isolateExecute = true 才能生效
	 * 
	 * @return
	 */
	int weight() default 1;
	
	/**
	 * 是否开启
	 * 
	 * @return
	 */
	boolean opened() default true;

	/**
	 * 定义执行的线程池：dispatchMethod, executeMethod, 和并行模式
	 * 
	 * @return
	 */
	@AliasFor(annotation = FluxService.class)
	Context context() default Context.Concurrent;

	/**
	 * 默认在统一的线程池中执行，每个执行者最多占用一半的线程
	 * 
	 * @return 可以设置在哪个 pool 中运行
	 */
	@AliasFor(annotation = FluxService.class)
	String pool() default StringUtils.EMPTY;

	/**
	 * 定义了 pool，此参数才会生效
	 * 
	 * @return 定义线程池的线程数
	 */
	@AliasFor(annotation = FluxService.class)
	int workers() default 1;

	/**
	 * 最大并发：占用一半的线程来执行任务 这里和设置 context = Context.Order 效果一样
	 * 
	 * @return 发布服务的个数
	 */
	@AliasFor(annotation = FluxService.class)
	int parallel() default -1;
}
